/**
 * Notes: passport模块控制器
 * Date: 2021-03-15 19:20:00 
 * Ver : CCMiniCloud Framework 2.0.1 ALL RIGHTS RESERVED BY cclinux0730 (wechat)
 */

const BaseProjectController = require('./base_project_controller.js');
const PassportService = require('../service/passport_service.js');
const contentCheck = require('../../../framework/validate/content_check.js');

class PassportController extends BaseProjectController {

	/** 取得我的用户信息 */
	async getMyDetail() {
		try {
			let service = new PassportService();
			let user = await service.getMyDetail(this._userId);
			
			// 确保返回一个对象，即使用户不存在
			return user || {};
		} catch (err) {
			console.error('[passport_controller] getMyDetail 错误:', err);
			return {}; // 出错时返回空对象，保持一致性
		}
	}

	/** 获取手机号码 */
	async getPhone() {

		// 数据校验
		let rules = {
			cloudID: 'must|string|min:1|max:200|name=cloudID',
		};

		// 取得数据
		let input = this.validateData(rules);


		let service = new PassportService();
		return await service.getPhone(input.cloudID);
	}


	/** 注册 */
	async register() {
		try {
			// 数据校验
			let rules = { 
				mobile: 'must|string|name=手机',
				name: 'must|string|name=姓名',
				forms: 'must|array|name=表单',
				status: 'int|default=1',
				password: 'string|min:6|max:30|name=密码|default='
			};

			// 取得数据
			let input = this.validateData(rules);
			
			console.log('[register] 控制器接收到的数据:', {
				mobile: input.mobile,
				name: input.name,
				formsLength: input.forms?.length || 0,
				password: input.password ? '已提供' : '未提供',
				formsData: input.forms || []
			});
			
			// 确保手机号格式正确
			if (!/^1\d{10}$/.test(input.mobile)) {
				this.AppError('请输入正确的手机号码(11位数字)');
			}
			
			// 确保姓名正确
			if (!input.name || input.name.length < 2) {
				this.AppError('请输入正确的姓名(至少2个字符)');
			}
			
			// 确保表单数据存在
			if (!Array.isArray(input.forms) || input.forms.length === 0) {
				this.AppError('表单数据为空arr');
			}

			// 内容审核
			await contentCheck.checkTextMultiClient(input);
			
			console.log('[register] 请求验证通过，开始处理注册');

			let service = new PassportService();
			return await service.register(this._userId, input);
		} catch (err) {
			console.error('[register] 控制器异常:', err);
			throw err; // 保留原始错误
		}
	}

	/** 修改用户资料 */
	async editBase() {
		// 数据校验
		let rules = { 
			name: 'must|string|min:1|max:30|name=姓名',
			mobile: 'must|mobile|name=手机',
			forms: 'array|name=表单',
		};

		// 取得数据
		let input = this.validateData(rules);

		// 内容审核
		await contentCheck.checkTextMultiClient(input);

		let service = new PassportService();
		return await service.editBase(this._userId, input);
	}

	/** 登录操作 */
	async login() {
		// 数据校验
		let rules = {
			name: 'must|string|name=姓名',
			pwd: 'must|string|min=6|max=30|name=密码', 
		};

		// 取得数据
		let input = this.validateData(rules);

		let service = new PassportService();
		return await service.login(input.name, input.pwd);
	}

	/** 带密码登录 */
	async loginWithPassword() {
		// 数据校验
		let rules = {
			mobile: 'string|len=11|name=手机',
			password: 'string|min=6|max=30|name=密码', 
		};

		// 取得数据
		let input = this.validateData(rules);

		let service = new PassportService();
		return await service.loginWithPassword(input.mobile, input.password);
	}

	/** 密码重置 */
	async resetPassword() {
		// 数据校验
		let rules = {
			mobile: 'must|string|len=11|name=手机',
			newPassword: 'must|string|min=6|max=30|name=新密码', 
		};

		// 取得数据
		let input = this.validateData(rules);

		let service = new PassportService();
		return await service.resetPassword(input.mobile, input.newPassword);
	}

	/** 检查白名单 */
	async check_whitelist() {
		// 数据校验
		let rules = { 
			name: 'must|string|min:1|max:30|name=姓名',
			mobile: 'must|mobile|name=手机',
		};

		// 取得数据
		let input = this.validateData(rules);

		let service = new PassportService();
		return await service.check_whitelist(input.name, input.mobile);
	}

	/**
	 * 退出登录 
	 */
	async logout() {
		// 获取token
		let token = this._token;
		if (!token) {
			// 如果没有token，说明已经是未登录状态
			return {
				result: true
			};
		}

		console.log('[LOGOUT] 用户退出:', token);

		// 简单实现退出状态清理
		// 返回成功结果，客户端会清除本地token
		return {
			result: true
		};
	}

}

module.exports = PassportController;